[Xamarin.Mac] アラートを表示してみました
1 はじめに
CX事業本部の平内(SIN)です。
Xamarin.Macを使用すると、C#でネイティブなMacのアプリが作成可能です。 ここでは、私自身がXamarin.Macに入門して学習した事項を覚書として書かせて頂いています。
GUIアプリの入門で、とりあえずのモックとしてアラートを表示する場面は、多いと思います。ということで、今回は、アラートを表示してみました。
2 とりあえず表示
配置したボタンをクリックすると、アラートを表示する簡単なコードです。
partial void onClick(NSObject sender) { var alert = new NSAlert() { AlertStyle = NSAlertStyle.Warning, MessageText = "アラートの要約", InformativeText = "アラートの詳細な説明", Icon = NSImage.ImageNamed(NSImageName.Caution) }; alert.RunModal(); }
(1) AlertStyle
アラートのスタイルで、Warning,Informational,Criticalの3種類が指定可能です。表示上に大きな違いは無いようです。
public enum NSAlertStyle : ulong { Warning, Informational, Critical }
(2) MessageText
アラートの要約(省略すると、Alertと表示されます)
(3) InformativeText
アラートの詳細説明
(4) Icon
表示するアイコン(省略すると、AlertStyleに応じたデフォルトのアイコンが表示されます)
3 その他の要素
アラートには、上記のほかにもいくつかの要素を追加できます。
Human Interface Guidelines - Alerts
(1) ボタン
デフォルトで表示されるボタン以外を設定する場合は、AddButton() メソッドで追加します。
var alert = new NSAlert() { // .... }; alert.AddButton("Ok"); alert.AddButton("Cancel"); alert.RunModal();
(2) SuppressionButton
ShowsSuppressionButtonをtrueにすることで、チェックボックスを表示できます。
var alert = new NSAlert() { // .... }; alert.ShowsSuppressionButton = true; alert.SuppressionButton.Title = "チェックに関するメッセージ"; alert.RunModal();
SuppressionButtonは、NSButtonとして、Titleなどの設定が可能です。
(3) AccessoryView
AccessoryViewを使用すると、追加情報を提供できます。
var alert = new NSAlert() { // .... }; var input = new NSTextField(new CGRect(0, 0, 300, 20)); alert.AccessoryView = input; alert.RunModal();
AccessoryViewは、NSViewなので、任意のビューを指定できます。また、受け取った入力は、NSAlertとは別に、追加したビューのオブジェクトとしてアクセスします。
4 NSAlertの戻り値
NSAlertの戻り値は、nint型で1000以降の数値となります。
var alert = new NSAlert() { // .... }; alert.AddButton("1000"); alert.AddButton("1001"); alert.AddButton("1002"); alert.AddButton("1003"); var result = alert.RunModal(); Console.WriteLine($"{result}");
出力ウインドウで、戻り値を確認している様子です。
5 最後に
今回は、アラートについて確認してみました。
とりあえず、「モック代わに」というような扱いで書いてしまいましたが、Appleのガイドラインでは、「警告アイコンは控えめに」「必要最小限での利用」が推奨となっています。
また、今回扱った、別ウインドウで表示されるものは、アプリ全体に関するアラートに使用し、特定のウインドウに関するのもは、ウインドウ内に表示されるalert.BeginSheet(this) を使用するようにとの記載もあります。
この辺、C#とは言え、Windowsアプリとは違うアプローチが必要だと思います。